EAP-TLS_Solution/EAP-TLS WebAPI (Core)/Program.cs (64 lines of code) (raw):
using System;
using System.IO;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.AspNetCore.Server.Kestrel.Https;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Configuration;
namespace EapTlsWebAPICore
{
public class Program
{
// NOTE: register 'az-CA' and the AS3 tenant's public certificates into the (hosting machine's) "User Trusted Certificates store"
public static int Main(string[] args)
{
try
{
Console.WriteLine("Starting web host");
CreateHostBuilder(args).Build().Run();
return 0;
}
catch (Exception ex)
{
Console.WriteLine("Host terminated unexpectedly");
Console.WriteLine(ex.ToString());
return 1;
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>()
.ConfigureKestrel(options =>
{
var configuration = options.ApplicationServices.GetRequiredService<IConfiguration>();
// Being this a self-hosted web-server, we need to setup the Server's *private* certificate.
// In a production hosting environment, this will be deployed by the administrators in the hosting Web Server
var rootCACertificate = new X509Certificate2(Path.Combine("certs", configuration.GetValue<string>("webApiPrivateCertificateFileName")), configuration.GetValue<string>("webApiPrivateKeyPassword"));
options.Limits.MaxConcurrentConnections = 10;
options.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
options.Limits.MinRequestBodyDataRate = null;
options.ConfigureHttpsDefaults(o =>
{
o.ServerCertificate = rootCACertificate;
o.ClientCertificateMode = ClientCertificateMode.RequireCertificate;
o.SslProtocols = System.Security.Authentication.SslProtocols.Tls12;
o.ClientCertificateValidation = (cert, certChain, sslPolicyErrors) =>
{
// https://learn.microsoft.com/en-us/aspnet/core/security/authentication/certauth
Console.WriteLine("Azure Sphere Device ID: " + cert?.GetNameInfo(X509NameType.SimpleName, false));
Console.WriteLine("Certificate Thumbprint: " + cert?.Thumbprint);
bool isValid = true;
// [...] Your *additional* custom validation logic in here
//isValid = MyCertificateValidation.ValidateCertificate(cert);
return isValid;
};
});
options.Listen(new IPEndPoint(new IPAddress(0), 44378), listenOptions =>
{
listenOptions.UseHttps(rootCACertificate);
listenOptions.Protocols = HttpProtocols.Http1AndHttp2;
listenOptions.UseConnectionLogging();
});
});
});
}
}